package EventTracer;
import java.awt.Component;
import java.awt.Container;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class EventTracer
{
public EventTracer()
{
//Prelucrarea tuturor proxy
handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println(method + ":" + args[0]);
return null;
}
};
}
/**
* Adauga obiecte EventTracer la toate evenimentele care pot fi
* identificate la componentul dat si subclase
* @param c componet
*/
public void add(Component c)
{
try
{
//Luarea tuturor evenimentelor care pot pot fi citite
BeanInfo info = Introspector.getBeanInfo(c.getClass());
EventSetDescriptor[] eventSets = info.getEventSetDescriptors();
for(EventSetDescriptor eventSet : eventSets)
{
addListner(c,eventSet);
}
}catch(IntrospectionException e)
{
//Daca se genearaza o exceptie listnerii nu se adauga
}
if(c instanceof Container)
{
//Luarea tutturor obiectelor din subclasa
//si recursiv se cheama metoda adds
for(Component comp: ((Container) c).getComponents())
{
add(comp);
}
}
}
/**
* Adaugarea listnerului pentru activitati
* @param c Component
* @param eventSet descrierea listnerului
*/
public void addListner(Component c, EventSetDescriptor eventSet)
{
//Crearea proxyObiectului pentru tipul dat si redirectionarea chemerilor
Object proxy = Proxy.newProxyInstance(null, new Class[] {eventSet.getListenerType()}, handler);
//Adaugarea proxy in calitate de listner pentru component
Method addListnerMethod = eventSet.getAddListenerMethod();
try
{
addListnerMethod.invoke(c, proxy);
}
catch(InvocationTargetException e) {}
catch(IllegalAccessException e) {}
//Daca se genereaza o exceptie Listnerul nu se adauga
}
private InvocationHandler handler;
}